package cn.lblbc.downloadlib;

import java.util.ArrayList;
import java.util.List;

/**
 * 分片工具类
 */
public class ChunkUtils {
    
    /**
     * 根据文件大小和配置计算分片列表
     * 
     * @param fileId 文件ID
     * @param fileSize 文件大小
     * @param config 下载配置
     * @return 分片列表
     */
    public static List<DownloadChunk> calculateChunks(long fileId, long fileSize, DownloadConfig config) {
        List<DownloadChunk> chunks = new ArrayList<>();
        
        if (fileSize <= 0) {
            return chunks;
        }
        
        // 如果未启用分片下载，则整个文件作为一个分片
        if (!config.isEnableChunkDownload()) {
            DownloadChunk chunk = new DownloadChunk();
            chunk.setFileId(fileId);
            chunk.setStartPos(0);
            chunk.setEndPos(fileSize - 1);
            chunk.setDownloadedSize(0);
            chunk.setCreateTime(System.currentTimeMillis());
            chunk.setUpdateTime(System.currentTimeMillis());
            chunks.add(chunk);
            return chunks;
        }
        
        // 计算分片数量和大小
        int chunkCount;
        long chunkSize;
        
        // 如果设置了最大分片数且大于0，则按最大分片数切分
        if (config.getMaxChunksPerFile() > 0) {
            chunkCount = Math.min(config.getMaxChunksPerFile(), (int) ((fileSize + config.getChunkSize() - 1) / config.getChunkSize()));
            chunkSize = fileSize / chunkCount;
        } else {
            // 否则按照固定的分片大小切分
            chunkSize = config.getChunkSize();
            chunkCount = (int) ((fileSize + chunkSize - 1) / chunkSize);
        }
        
        // 创建分片
        for (int i = 0; i < chunkCount; i++) {
            DownloadChunk chunk = new DownloadChunk();
            chunk.setFileId(fileId);
            chunk.setStartPos(i * chunkSize);
            
            // 最后一个分片需要特殊处理，确保不超过文件大小
            if (i == chunkCount - 1) {
                chunk.setEndPos(fileSize - 1);
            } else {
                chunk.setEndPos((i + 1) * chunkSize - 1);
            }
            
            chunk.setDownloadedSize(0);
            chunk.setCreateTime(System.currentTimeMillis());
            chunk.setUpdateTime(System.currentTimeMillis());
            chunks.add(chunk);
        }
        
        return chunks;
    }
}